package com.hejing.异常处理方式1_try_catch;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * ClassName: FinallyTest
 * Package: com.hejing.异常处理方式1_try_catch
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-04-10 21:02
 * @Version: 1.0
 */
public class FinallyTest {
    /**
     * 无 finally
     */
    @Test
    public void test01() {
        try {
            String str = "123";
            str = "abc";
            int i = Integer.parseInt(str);
            System.out.println(i);
        } catch (NumberFormatException e) {
            e.printStackTrace();

            System.out.println(10 / 0);  // 如果1在catch 中出现异常， 后续 System.out.println("程序结束") 不会被执行
        }

        System.out.println("程序结束");
    }

    /**
     * 有 finally
     */
    @Test
    public void test02() {
        try {
            String str = "123";
            str = "abc";
            int i = Integer.parseInt(str);
            System.out.println(i);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            System.out.println(10 / 0);  // 如果在catch中出现了异常，finally代码块中的中sout("程序结束")仍然会被执行。
        } finally {
            System.out.println("程序结束");
        }
    }


    /**
     * 实际开发中, finally的使用
     */
    @Test
    public void test03() {
        File file = new File("D:\\HeJing_Java\\test\\hello.txt");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);  // 可能报 FileNotFoundException
            int data = fis.read();  // 可能报 IOException
            while (data != -1) {
                System.out.print((char) data);
                data = fis.read();  // 可能报 IOException
            }
            // fis.close();  fis.close()写在此处可能会执行不到。因此需要写到 finally结构中。
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 重点: 将流资源的关闭代码放置在 finally结构中。
            try {
                if (fis != null)  // 仔细揣摩这一句代码
                    fis.close();  // 可能报 IOException 异常
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}



























